/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ws.converter;

import entidade.persistencia.Produto;
import java.net.URI;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import entidade.persistencia.ProdutoVenda;
import entidade.persistencia.ProdutoManutencao;
import entidade.persistencia.ProdutoCompra;
import entidade.persistencia.ReparoProdutoNumeroSerie;
import entidade.persistencia.ProdutoNumeroSerie;
import entidade.persistencia.CategoriaProduto;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author victorinox
 */

@XmlRootElement(name = "produto")
public class ProdutoConverter {
    private Produto entity;
    private URI uri;
    private int expandLevel;
  
    /** Creates a new instance of ProdutoConverter */
    public ProdutoConverter() {
        entity = new Produto();
    }

    /**
     * Creates a new instance of ProdutoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public ProdutoConverter(Produto entity, URI uri, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getProdutoId() + "/").build() : uri;
        this.expandLevel = expandLevel;
        getProdutoNumeroSerieCollection();
        getCategoriaId();
        getProdutoVendaCollection();
        getReparoProdutoNumeroSerieCollection();
        getProdutoManutencaoCollection();
        getProdutoCompraCollection();
    }

    /**
     * Creates a new instance of ProdutoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded
     */
    public ProdutoConverter(Produto entity, URI uri, int expandLevel) {
        this(entity, uri, expandLevel, false);
    }

    /**
     * Getter for produtoId.
     *
     * @return value for produtoId
     */
    @XmlElement
    public Integer getProdutoId() {
        return (expandLevel > 0) ? entity.getProdutoId() : null;
    }

    /**
     * Setter for produtoId.
     *
     * @param value the value to set
     */
    public void setProdutoId(Integer value) {
        entity.setProdutoId(value);
    }

    /**
     * Getter for nome.
     *
     * @return value for nome
     */
    @XmlElement
    public String getNome() {
        return (expandLevel > 0) ? entity.getNome() : null;
    }

    /**
     * Setter for nome.
     *
     * @param value the value to set
     */
    public void setNome(String value) {
        entity.setNome(value);
    }

    /**
     * Getter for descricao.
     *
     * @return value for descricao
     */
    @XmlElement
    public String getDescricao() {
        return (expandLevel > 0) ? entity.getDescricao() : null;
    }

    /**
     * Setter for descricao.
     *
     * @param value the value to set
     */
    public void setDescricao(String value) {
        entity.setDescricao(value);
    }

    /**
     * Getter for fichaExterna.
     *
     * @return value for fichaExterna
     */
    @XmlElement
    public String getFichaExterna() {
        return (expandLevel > 0) ? entity.getFichaExterna() : null;
    }

    /**
     * Setter for fichaExterna.
     *
     * @param value the value to set
     */
    public void setFichaExterna(String value) {
        entity.setFichaExterna(value);
    }

    /**
     * Getter for fichaTecnica.
     *
     * @return value for fichaTecnica
     */
    @XmlElement
    public String getFichaTecnica() {
        return (expandLevel > 0) ? entity.getFichaTecnica() : null;
    }

    /**
     * Setter for fichaTecnica.
     *
     * @param value the value to set
     */
    public void setFichaTecnica(String value) {
        entity.setFichaTecnica(value);
    }

    /**
     * Getter for visivelVitrine.
     *
     * @return value for visivelVitrine
     */
    @XmlElement
    public Boolean getVisivelVitrine() {
        return (expandLevel > 0) ? entity.getVisivelVitrine() : null;
    }

    /**
     * Setter for visivelVitrine.
     *
     * @param value the value to set
     */
    public void setVisivelVitrine(Boolean value) {
        entity.setVisivelVitrine(value);
    }

    /**
     * Getter for pesoVitrine.
     *
     * @return value for pesoVitrine
     */
    @XmlElement
    public Integer getPesoVitrine() {
        return (expandLevel > 0) ? entity.getPesoVitrine() : null;
    }

    /**
     * Setter for pesoVitrine.
     *
     * @param value the value to set
     */
    public void setPesoVitrine(Integer value) {
        entity.setPesoVitrine(value);
    }

    /**
     * Getter for imagem.
     *
     * @return value for imagem
     */
    @XmlElement
    public byte[] getImagem() {
        return (expandLevel > 0) ? entity.getImagem() : null;
    }

    /**
     * Setter for imagem.
     *
     * @param value the value to set
     */
    public void setImagem(byte[] value) {
        entity.setImagem(value);
    }

    /**
     * Getter for quantidadeEstoque.
     *
     * @return value for quantidadeEstoque
     */
    @XmlElement
    public Integer getQuantidadeEstoque() {
        return (expandLevel > 0) ? entity.getQuantidadeEstoque() : null;
    }

    /**
     * Setter for quantidadeEstoque.
     *
     * @param value the value to set
     */
    public void setQuantidadeEstoque(Integer value) {
        entity.setQuantidadeEstoque(value);
    }

    /**
     * Getter for precoUnitarioProposto.
     *
     * @return value for precoUnitarioProposto
     */
    @XmlElement
    public Float getPrecoUnitarioProposto() {
        return (expandLevel > 0) ? entity.getPrecoUnitarioProposto() : null;
    }

    /**
     * Setter for precoUnitarioProposto.
     *
     * @param value the value to set
     */
    public void setPrecoUnitarioProposto(Float value) {
        entity.setPrecoUnitarioProposto(value);
    }

    /**
     * Getter for descricaoProdutoParticionado.
     *
     * @return value for descricaoProdutoParticionado
     */
    @XmlElement
    public String getDescricaoProdutoParticionado() {
        return (expandLevel > 0) ? entity.getDescricaoProdutoParticionado() : null;
    }

    /**
     * Setter for descricaoProdutoParticionado.
     *
     * @param value the value to set
     */
    public void setDescricaoProdutoParticionado(String value) {
        entity.setDescricaoProdutoParticionado(value);
    }

    /**
     * Getter for isVirtual.
     *
     * @return value for isVirtual
     */
    @XmlElement
    public Boolean getIsVirtual() {
        return (expandLevel > 0) ? entity.getIsVirtual() : null;
    }

    /**
     * Setter for isVirtual.
     *
     * @param value the value to set
     */
    public void setIsVirtual(Boolean value) {
        entity.setIsVirtual(value);
    }

    /**
     * Getter for virtualDataEntrega.
     *
     * @return value for virtualDataEntrega
     */
    @XmlElement
    public Date getVirtualDataEntrega() {
        return (expandLevel > 0) ? entity.getVirtualDataEntrega() : null;
    }

    /**
     * Setter for virtualDataEntrega.
     *
     * @param value the value to set
     */
    public void setVirtualDataEntrega(Date value) {
        entity.setVirtualDataEntrega(value);
    }

    /**
     * Getter for isCrossDocking.
     *
     * @return value for isCrossDocking
     */
    @XmlElement
    public Boolean getIsCrossDocking() {
        return (expandLevel > 0) ? entity.getIsCrossDocking() : null;
    }

    /**
     * Setter for isCrossDocking.
     *
     * @param value the value to set
     */
    public void setIsCrossDocking(Boolean value) {
        entity.setIsCrossDocking(value);
    }

    /**
     * Getter for crossDockingDataEntrega.
     *
     * @return value for crossDockingDataEntrega
     */
    @XmlElement
    public Date getCrossDockingDataEntrega() {
        return (expandLevel > 0) ? entity.getCrossDockingDataEntrega() : null;
    }

    /**
     * Setter for crossDockingDataEntrega.
     *
     * @param value the value to set
     */
    public void setCrossDockingDataEntrega(Date value) {
        entity.setCrossDockingDataEntrega(value);
    }

    /**
     * Getter for pesoKg.
     *
     * @return value for pesoKg
     */
    @XmlElement
    public Integer getPesoKg() {
        return (expandLevel > 0) ? entity.getPesoKg() : null;
    }

    /**
     * Setter for pesoKg.
     *
     * @param value the value to set
     */
    public void setPesoKg(Integer value) {
        entity.setPesoKg(value);
    }

    /**
     * Getter for largura.
     *
     * @return value for largura
     */
    @XmlElement
    public Float getLargura() {
        return (expandLevel > 0) ? entity.getLargura() : null;
    }

    /**
     * Setter for largura.
     *
     * @param value the value to set
     */
    public void setLargura(Float value) {
        entity.setLargura(value);
    }

    /**
     * Getter for profundidade.
     *
     * @return value for profundidade
     */
    @XmlElement
    public Float getProfundidade() {
        return (expandLevel > 0) ? entity.getProfundidade() : null;
    }

    /**
     * Setter for profundidade.
     *
     * @param value the value to set
     */
    public void setProfundidade(Float value) {
        entity.setProfundidade(value);
    }

    /**
     * Getter for altura.
     *
     * @return value for altura
     */
    @XmlElement
    public Float getAltura() {
        return (expandLevel > 0) ? entity.getAltura() : null;
    }

    /**
     * Setter for altura.
     *
     * @param value the value to set
     */
    public void setAltura(Float value) {
        entity.setAltura(value);
    }

    /**
     * Getter for dataUltimaAlteracao.
     *
     * @return value for dataUltimaAlteracao
     */
    @XmlElement
    public Date getDataUltimaAlteracao() {
        return (expandLevel > 0) ? entity.getDataUltimaAlteracao() : null;
    }

    /**
     * Setter for dataUltimaAlteracao.
     *
     * @param value the value to set
     */
    public void setDataUltimaAlteracao(Date value) {
        entity.setDataUltimaAlteracao(value);
    }

    /**
     * Getter for produtoNumeroSerieCollection.
     *
     * @return value for produtoNumeroSerieCollection
     */
    @XmlElement
    public ProdutoNumeroSeriesConverter getProdutoNumeroSerieCollection() {
        if (expandLevel > 0) {
            if (entity.getProdutoNumeroSerieCollection() != null) {
                return new ProdutoNumeroSeriesConverter(entity.getProdutoNumeroSerieCollection(), uri.resolve("produtoNumeroSerieCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoNumeroSerieCollection.
     *
     * @param value the value to set
     */
    public void setProdutoNumeroSerieCollection(ProdutoNumeroSeriesConverter value) {
        entity.setProdutoNumeroSerieCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for categoriaId.
     *
     * @return value for categoriaId
     */
    @XmlElement
    public CategoriaProdutoConverter getCategoriaId() {
        if (expandLevel > 0) {
            if (entity.getCategoriaId() != null) {
                return new CategoriaProdutoConverter(entity.getCategoriaId(), uri.resolve("categoriaId/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for categoriaId.
     *
     * @param value the value to set
     */
    public void setCategoriaId(CategoriaProdutoConverter value) {
        entity.setCategoriaId((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for produtoVendaCollection.
     *
     * @return value for produtoVendaCollection
     */
    @XmlElement
    public ProdutoVendasConverter getProdutoVendaCollection() {
        if (expandLevel > 0) {
            if (entity.getProdutoVendaCollection() != null) {
                return new ProdutoVendasConverter(entity.getProdutoVendaCollection(), uri.resolve("produtoVendaCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoVendaCollection.
     *
     * @param value the value to set
     */
    public void setProdutoVendaCollection(ProdutoVendasConverter value) {
        entity.setProdutoVendaCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for reparoProdutoNumeroSerieCollection.
     *
     * @return value for reparoProdutoNumeroSerieCollection
     */
    @XmlElement
    public ReparoProdutoNumeroSeriesConverter getReparoProdutoNumeroSerieCollection() {
        if (expandLevel > 0) {
            if (entity.getReparoProdutoNumeroSerieCollection() != null) {
                return new ReparoProdutoNumeroSeriesConverter(entity.getReparoProdutoNumeroSerieCollection(), uri.resolve("reparoProdutoNumeroSerieCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for reparoProdutoNumeroSerieCollection.
     *
     * @param value the value to set
     */
    public void setReparoProdutoNumeroSerieCollection(ReparoProdutoNumeroSeriesConverter value) {
        entity.setReparoProdutoNumeroSerieCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for produtoManutencaoCollection.
     *
     * @return value for produtoManutencaoCollection
     */
    @XmlElement
    public ProdutoManutencaoesConverter getProdutoManutencaoCollection() {
        if (expandLevel > 0) {
            if (entity.getProdutoManutencaoCollection() != null) {
                return new ProdutoManutencaoesConverter(entity.getProdutoManutencaoCollection(), uri.resolve("produtoManutencaoCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoManutencaoCollection.
     *
     * @param value the value to set
     */
    public void setProdutoManutencaoCollection(ProdutoManutencaoesConverter value) {
        entity.setProdutoManutencaoCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for produtoCompraCollection.
     *
     * @return value for produtoCompraCollection
     */
    @XmlElement
    public ProdutoComprasConverter getProdutoCompraCollection() {
        if (expandLevel > 0) {
            if (entity.getProdutoCompraCollection() != null) {
                return new ProdutoComprasConverter(entity.getProdutoCompraCollection(), uri.resolve("produtoCompraCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoCompraCollection.
     *
     * @param value the value to set
     */
    public void setProdutoCompraCollection(ProdutoComprasConverter value) {
        entity.setProdutoCompraCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Returns the URI associated with this converter.
     *
     * @return the uri
     */
    @XmlAttribute
    public URI getUri() {
        return uri;
    }

    /**
     * Sets the URI for this reference converter.
     *
     */
    public void setUri(URI uri) {
        this.uri = uri;
    }

    /**
     * Returns the Produto entity.
     *
     * @return an entity
     */
    @XmlTransient
    public Produto getEntity() {
        if (entity.getProdutoId() == null) {
            ProdutoConverter converter = UriResolver.getInstance().resolve(ProdutoConverter.class, uri);
            if (converter != null) {
                entity = converter.getEntity();
            }
        }
        return entity;
    }

    /**
     * Returns the resolved Produto entity.
     *
     * @return an resolved entity
     */
    public Produto resolveEntity(EntityManager em) {
        List<ProdutoNumeroSerie> produtoNumeroSerieCollection = entity.getProdutoNumeroSerieCollection();
        List<ProdutoNumeroSerie> newprodutoNumeroSerieCollection = new java.util.ArrayList<ProdutoNumeroSerie>();
        for (ProdutoNumeroSerie item : produtoNumeroSerieCollection) {
            newprodutoNumeroSerieCollection.add(em.getReference(ProdutoNumeroSerie.class, item.getNumeroSerieId()));
        }
        entity.setProdutoNumeroSerieCollection(newprodutoNumeroSerieCollection);
        CategoriaProduto categoriaId = entity.getCategoriaId();
        if (categoriaId != null) {
            entity.setCategoriaId(em.getReference(CategoriaProduto.class, categoriaId.getCategoriaId()));
        }
        List<ProdutoVenda> produtoVendaCollection = entity.getProdutoVendaCollection();
        List<ProdutoVenda> newprodutoVendaCollection = new java.util.ArrayList<ProdutoVenda>();
        for (ProdutoVenda item : produtoVendaCollection) {
            newprodutoVendaCollection.add(em.getReference(ProdutoVenda.class, item.getProdutoVendaPK()));
        }
        entity.setProdutoVendaCollection(newprodutoVendaCollection);
        List<ReparoProdutoNumeroSerie> reparoProdutoNumeroSerieCollection = entity.getReparoProdutoNumeroSerieCollection();
        List<ReparoProdutoNumeroSerie> newreparoProdutoNumeroSerieCollection = new java.util.ArrayList<ReparoProdutoNumeroSerie>();
        for (ReparoProdutoNumeroSerie item : reparoProdutoNumeroSerieCollection) {
            newreparoProdutoNumeroSerieCollection.add(em.getReference(ReparoProdutoNumeroSerie.class, item.getReparoProdutoNumeroSerieId()));
        }
        entity.setReparoProdutoNumeroSerieCollection(newreparoProdutoNumeroSerieCollection);
        List<ProdutoManutencao> produtoManutencaoCollection = entity.getProdutoManutencaoCollection();
        List<ProdutoManutencao> newprodutoManutencaoCollection = new java.util.ArrayList<ProdutoManutencao>();
        for (ProdutoManutencao item : produtoManutencaoCollection) {
            newprodutoManutencaoCollection.add(em.getReference(ProdutoManutencao.class, item.getProdutoManutencaoPK()));
        }
        entity.setProdutoManutencaoCollection(newprodutoManutencaoCollection);
        List<ProdutoCompra> produtoCompraCollection = entity.getProdutoCompraCollection();
        List<ProdutoCompra> newprodutoCompraCollection = new java.util.ArrayList<ProdutoCompra>();
        for (ProdutoCompra item : produtoCompraCollection) {
            newprodutoCompraCollection.add(em.getReference(ProdutoCompra.class, item.getProdutoCompraPK()));
        }
        entity.setProdutoCompraCollection(newprodutoCompraCollection);
        return entity;
    }
}
